package com.springboot.frame.excel;

import com.springboot.frame.excel.enums.Excels;
import org.apache.commons.collections4.CollectionUtils;
import java.io.*;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * @author TaoYu KanYuXia
 */
public final class ExcelHelper {

  private ExcelHelper() {
  }

  /**
   * 根据数据导出工作簿到指定文件（无标题）
   *
   * @param data 集合数据
   * @param file 文件
   */
  public static void write(Collection<?> data, File file) throws FileNotFoundException {
    write(null, data, file);
  }

  /**
   * 根据数据导出工作簿到指定文件
   *
   * @param title 标题
   * @param data 集合数据
   * @param file 文件
   */
  public static void write(String title, Collection<?> data, File file)
      throws FileNotFoundException {
    write(title, data, new FileOutputStream(file), Excels.nameOfType(file));
  }

  /**
   * 根据数据导出工作簿（无标题）
   *
   * @param data 集合数据
   * @param out 输出流
   */
  public static void write(Collection<?> data, OutputStream out) {
    write(null, data, out);
  }

    /**
     * 根据数据导出工作簿（无标题）
     * @param data 集合数据
     * @param out 输出流
     * @param password 受保护的密码
     */
    public static void write(Collection<?> data, OutputStream out, String password) {
        write(null, data, out, null, password);
    }

  /**
   * 根据数据导出工作簿
   *
   * @param title 标题
   * @param data 集合数据
   * @param out 输出流
   */
  public static void write(String title, Collection<?> data, OutputStream out) {
    write(title, data, out, null);
  }

  /**
   * 根据数据导出工作簿
   *
   * @param title 标题
   * @param data 集合数据
   * @param out 输出流
   * @param excels EXCEL类型
   */
  public static void write(String title, Collection<?> data, OutputStream out, Excels excels) {
    write(title, data, out, excels, null);
  }

  /**
   * 根据数据导出工作簿
   * @param title 标题
   * @param data 集合数据
   * @param out 输出流
   * @param excels EXCEL类型
   * @param password 受保护的密码
   */
  public static void write(String title, Collection<?> data, OutputStream out, Excels excels, String password) {
    ExcelWriter.of(excels).sheet(title, data, password).write(out);
  }

  /**
   * 导入Excel
   *
   * @param in 输入流
   * @return 导入数据
   */
  public static <T> List<T> read(InputStream in, Class<T> clazz) {
    return read(Excels.XLS, in, clazz);
  }

  /**
   * 导入Excel
   *
   * @param file 文件
   * @param clazz 导入对象Class类型
   * @param <T> 导入对象类型
   * @return 导入数据
   * @throws FileNotFoundException 文件不存在
   */
  public static <T> List<T> read(File file, Class<T> clazz) throws FileNotFoundException {
    return read(Excels.nameOfType(file), new FileInputStream(file), clazz);
  }

  /**
   * 导入Excel
   *
   * @param file 文件
   * @param clazz 导入对象Class类型
   * @param <T> 导入对象类型
   * @param startRows 读入Excel起始行
   * @return 导入数据
   * @throws FileNotFoundException 文件不存在
   */
  public static <T> List<T> read(File file, Class<T> clazz, int startRows)
      throws FileNotFoundException {
    return read(Excels.nameOfType(file), new FileInputStream(file), clazz, startRows);
  }

  /**
   * 导入Excel
   *
   * @param excels EXCEL类型
   * @param in 输入流
   * @param clazz 导入对象Class类型
   * @return 导入数据
   */
  @SuppressWarnings("unchecked")
  public static <T> List<T> read(Excels excels, InputStream in, Class<T> clazz) {
    return read(excels, in, clazz, 2);
  }

  /**
   * 导入Excel
   *
   * @param excels EXCEL类型
   * @param in 输入流
   * @param clazz 导入对象Class类型
   * @param startRows 读入Excel起始行
   * @return 导入数据
   */
  @SuppressWarnings("unchecked")
  public static <T> List<T> read(Excels excels, InputStream in, Class<T> clazz, int startRows) {
    List<List<?>> result = ExcelReader.of(excels, in).sheet(clazz, startRows).read();
    if (CollectionUtils.isNotEmpty(result)) {
      return (List<T>) result.get(0);
    }
    return Collections.emptyList();
  }

}
